package com.rt.gptnext.common.bean;



import com.rt.gptnext.common.utils.CommonUtil;
import com.rt.gptnext.common.utils.json.JsonUtil;

import java.util.function.Consumer;

/**
 * @author gaoyiyang
 */
public interface IBean<T extends IBean<?>> {

	/**
	 * 拷贝
	 *
	 * @param o 拷贝来源
	 * @return 当前对象
	 */
	default T copy(Object o, Consumer<T> handler) {
		CommonUtil.copyBean(o, this);
		if (handler != null) {
			handler.accept((T) this);
		}
		return (T) this;
	}

	/**
	 * 拷贝
	 *
	 * @param o 拷贝来源
	 * @return 当前对象
	 */
	default T copy(Object o) {
		return copy(o, null);
	}

	/**
	 * 拷贝至对象
	 *
	 * @param s                目标类型
	 * @param ignoreProperties 忽略属性
	 * @return 目标对象
	 */
	default <S> S to(Class<S> s, String... ignoreProperties) {
		return CommonUtil.copyBean(this, s, ignoreProperties);
	}

	/**
	 * 拷贝至对象
	 *
	 * @param s                目标对象
	 * @param ignoreProperties 忽略属性
	 * @return 目标对象
	 */
	default <S> S to(S s, String... ignoreProperties) {
		return CommonUtil.copyBean(this, s, ignoreProperties);
	}

	/**
	 * 获取json字符串
	 *
	 * @return json字符串
	 */
	default String toJsonString() {
		return JsonUtil.toJsonString(this);
	}

}
